package test3

type QuackableAnimal interface {
	Quack()
}

type Duck struct {

}

func (Duck) Quack() {
	println("duck quack")
}

type Dog struct {

}
func (Dog) Quack() {
	println("dog quack")
}

type Bird struct {

}

func (Bird) Quack() {
	println("bird quack")
}

func AnimalQuackInForest(a QuackableAnimal) {
	a.Quack()
}

func Test1() {
	// 切片子元素类型为接口类型，三个实现了此接口方法的结构体可以承担此接口的责任，初始化
	animals := []QuackableAnimal{new(Duck), new(Dog), new(Bird)}
	for _, animal := range animals {
		// 此方法，参数为接口，任何实现此接口所有方法的类型都可以作为此参数
		AnimalQuackInForest(animal)
	}
}
